package com.ruoyi.utils;

import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.constant.RoleEnum;
import com.ruoyi.constant.v3.RoleV3Enum;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @program: ruoyi
 * @description: 基本工具类
 * @author: 高天乐
 * @create: 2023-08-17 10:44
 **/
public class BasicUtil {

    /**
     * 字段类型转为Double类型
     * @param field
     * @return
     */
    public static Double isDouble(String field){
        if ("null".equals(field) || StringUtils.isEmpty(field)){
            return null;
        }
        try {
            return Double.parseDouble(field);
        }catch (Exception e){
            throw new ServiceException("字段传值错误");
        }
    }

    /**
     * 判断接收的值是否是Double类型,并判断经纬度是否正确
     * @param s 值
     * @param pattern 经度/维度正则
     * @return
     */
    public static boolean isDouble(String s,String pattern){
        if (StringUtils.isEmpty(s)) {
            return false;
        }
        try {
            if (StringUtils.isNotEmpty(pattern)){
                return s.matches(pattern);
            }
            return true;
        }catch (NumberFormatException e){
            return false;
        }
    }

    /**
     * 正则判断
     * @param s 字符串
     * @param pattern 正则表达式
     */
    public static boolean isPattern(String s,String pattern){
        return s.matches(pattern);
    }

    /**
     * 删除文件夹
     * @param folder
     */
    public static void deleteFolder(File folder){
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    deleteFolder(file);
                } else {
                    file.delete();
                }
            }
        }
        folder.delete();
    }

    /**
     * 根据角色判断操作权限
     * @param roleEnum 角色信息
     * @param message 提示信息
     */
    public static void isOperateAuthority(RoleV3Enum roleEnum, String message){
        // 获取当前的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //判断有没有自定义规则
        if (levelAndRoleJudeg(roleEnum,loginUser)) {
            return;
        }
        //判断是否是超级管理员账户
        boolean flag = loginUser.getUser().getRoles()
                .stream()
                .anyMatch(role -> role.getRoleKey().equals(RoleEnum.ADMIN.getCode()));
        if (!flag) {
            throw new ServiceException(message);
        }
    }

    /**
     * 判断当前用户有没有设定自定义权限规则
     * @param roleEnum 角色信息
     * @param loginUser 登录信息类
     */
    private static boolean levelAndRoleJudeg(RoleV3Enum roleEnum, LoginUser loginUser){
        List<String> collect = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
        //角色一致
        if (collect.contains(roleEnum.getCode()))
        //符合自定义权限规则
        {
            return true;
        }
        return false;
    }


    /**
     * 根据区划等级和角色判断操作权限
     * @param level 行政区划等级
     * @param roleEnum 角色信息
     * @param message 提示信息
     */
    public static void isOperateAuthority(String level,RoleEnum roleEnum,String message){
        // 获取当前的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //判断有没有自定义规则
        if (levelAndRoleJudeg(level,roleEnum,loginUser)) {
            return;
        }
        //判断是否是超级管理员账户
        boolean flag = loginUser.getUser().getRoles()
                .stream()
                .anyMatch(role -> role.getRoleKey().equals(RoleEnum.ADMIN.getCode()));
        if (!flag) {
            throw new ServiceException(message);
        }
    }

    /**
     * 判断当前用户有没有设定自定义权限规则
     * @param level 行政区划等级
     * @param roleEnum 角色信息
     * @param loginUser 登录信息类
     */
    private static boolean levelAndRoleJudeg(String level,RoleEnum roleEnum, LoginUser loginUser){
        //判断有没有操作权限
        if (StringUtils.isEmpty(level)) {
            return false;
        }
        //行政区规划等级一致
        if (loginUser.getRegionLevel().toString().equals(level))
        //角色一致
        {
            if (loginUser.getCsbsAll().contains(roleEnum.getCode()))
            //符合自定义权限规则
            {
                return true;
            }
        }
        return false;
    }
}
